home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / FILESYS.PAK / ABOUT.C next >
C/C++ Source or Header  |  1997-05-06  |  8KB  |  276 lines

  1.  
  2. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. // PARTICULAR PURPOSE.
  6. //
  7. // Copyright (C) 1993-1995 Microsoft Corporation.  All Rights Reserved.
  8. //
  9. //  MODULE:   about.c
  10. //
  11. //  PURPOSE:   Displays the "About" dialog box
  12. //
  13. //  FUNCTIONS:
  14. //    CmdAbout        - Displays the "About" dialog box
  15. //    About           - Processes messages for "About" dialog box.
  16. //    MsgAboutInit    - To initialize the about box with version info
  17. //                      from resources.
  18. //    MsgAboutCommand - Process WM_COMMAND message sent to the about box.
  19. //    CmdAboutDone    - Free the about box and related data.
  20. //
  21. //  COMMENTS:
  22. //
  23. //
  24.  
  25. #include <windows.h>            // required for all Windows applications
  26. #include "globals.h"            // prototypes specific to this application
  27. #include "resource.h"
  28.  
  29.  
  30. LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  31.  
  32. LRESULT MsgAboutInit(HWND, UINT, WPARAM, LPARAM);
  33. LRESULT MsgAboutCommand(HWND, UINT, WPARAM, LPARAM);
  34. LRESULT CmdAboutDone(HWND, WORD, WORD, HWND);
  35.  
  36. // About dialog message table definition.
  37. MSD rgmsdAbout[] =
  38. {
  39.     {WM_COMMAND,    MsgAboutCommand},
  40.     {WM_INITDIALOG, MsgAboutInit}
  41. };
  42.  
  43. MSDI msdiAbout =
  44. {
  45.     sizeof(rgmsdAbout) / sizeof(MSD),
  46.     rgmsdAbout,
  47.     edwpNone
  48. };
  49.  
  50. // About dialog command table definition.
  51. CMD rgcmdAbout[] =
  52. {
  53.     {IDOK,     CmdAboutDone},
  54.     {IDCANCEL, CmdAboutDone}
  55. };
  56.  
  57. CMDI cmdiAbout =
  58. {
  59.     sizeof(rgcmdAbout) / sizeof(CMD),
  60.     rgcmdAbout,
  61.     edwpNone
  62. };
  63.  
  64. // Module specific "globals"  Used when a variable needs to be
  65. // accessed in more than on handler function.
  66.  
  67. HFONT hFontCopyright;
  68.  
  69. //
  70. //  FUNCTION: CmdAbout(HWND, WORD, WORD, HWND)
  71. //
  72. //  PURPOSE: Displays the "About" dialog box
  73. //
  74. //  PARAMETERS:
  75. //    hwnd      - Window handle
  76. //    wCommand  - IDM_ABOUT (unused)
  77. //    wNotify   - Notification number (unused)
  78. //    hwndCtrl  - NULL (unused)
  79. //
  80. //  RETURN VALUE:
  81. //
  82. //    Always returns 0 - Message handled
  83. //
  84. //  COMMENTS:
  85. //    To process the IDM_ABOUT message, call DialogBox() to display the
  86. //    about dialog box.
  87.  
  88. #pragma argsused
  89. LRESULT CmdAbout(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  90. {
  91.     DialogBox(hInst, "AboutBox", hwnd, (DLGPROC)About);
  92.     return 0;
  93. }
  94.  
  95.  
  96. //
  97. //  FUNCTION: About(HWND, UINT, WPARAM, LPARAM)
  98. //
  99. //  PURPOSE:  Processes messages for "About" dialog box.
  100. //
  101. //  PARAMETERS:
  102. //    hdlg - window handle of the dialog box
  103. //    wMessage - type of message
  104. //    wparam - message-specific information
  105. //    lparam - message-specific information
  106. //
  107. //  RETURN VALUE:
  108. //    TRUE - message handled
  109. //    FALSE - message not handled
  110. //
  111. //  COMMENTS:
  112. //
  113. //     Display version information from the version section of the
  114. //     application resource.
  115. //
  116. //     Wait for user to click on "Ok" button, then close the dialog box.
  117. //
  118.  
  119. LRESULT CALLBACK About(HWND hdlg, UINT uMessage, WPARAM wparam, LPARAM lparam)
  120. {
  121.     return DispMessage(&msdiAbout, hdlg, uMessage, wparam, lparam);
  122. }
  123.  
  124.  
  125. //
  126. //  FUNCTION: MsgAboutInit(HWND, UINT, WPARAM, LPARAM)
  127. //
  128. //  PURPOSE: To initialize the about box with version info from resources.
  129. //
  130. //  PARAMETERS:
  131. //    hwnd - The window handing the message.
  132. //    uMessage - The message number. (unused).
  133. //    wparam - Message specific data (unused).
  134. //    lparam - Message specific data (unused).
  135. //
  136. //  RETURN VALUE:
  137. //    Always returns 0 - message handled.
  138. //
  139. //  COMMENTS:
  140. //    Uses the version apis to retrieve version information for
  141. //    each of the static text boxes in the about box.
  142. //
  143.  
  144. #pragma argsused
  145. LRESULT MsgAboutInit(HWND hdlg, UINT uMessage, WPARAM wparam, LPARAM lparam)
  146. {
  147.     #define POINTSIZE 8
  148.  
  149.     char  szFullPath[256];
  150.     DWORD dwVerHnd;
  151.     DWORD dwVerInfoSize;
  152.     HDC   hDC;
  153.     int   iLogPixelsY, iPointSize;
  154.  
  155.     // Center the dialog over the application window
  156.     CenterWindow(hdlg, GetWindow(hdlg, GW_OWNER));
  157.  
  158.     // Set the copyright font to something smaller than default
  159.     hDC = GetDC(hdlg);
  160.     iLogPixelsY = GetDeviceCaps(hDC, LOGPIXELSY);
  161.     ReleaseDC(hdlg, hDC);
  162.     iPointSize = MulDiv(iLogPixelsY, POINTSIZE, 72);
  163.     iPointSize *= -1;
  164.  
  165.     hFontCopyright = CreateFont(iPointSize,
  166.                                 0, 0, 0,
  167.                                 FW_BOLD,
  168.                                 0, 0, 0, 0,
  169.                                 0, 0, 0, 0,
  170.                                 "Arial");
  171.  
  172.     SendDlgItemMessage(hdlg, 
  173.                        IDD_VERLAST, 
  174.                        WM_SETFONT, 
  175.                        (WPARAM)hFontCopyright,
  176.                        0L);
  177.  
  178.     // Get version information from the application
  179.     GetModuleFileName(hInst, szFullPath, sizeof(szFullPath));
  180.     dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd);
  181.     if (dwVerInfoSize)
  182.     {
  183.         // If we were able to get the information, process it:
  184.         HANDLE  hMem;
  185.         LPVOID  lpvMem;
  186.         char    szGetName[256];
  187.         int     cchRoot;
  188.         int     i;
  189.  
  190.         hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
  191.         lpvMem = GlobalLock(hMem);
  192.         GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpvMem);
  193.         lstrcpy(szGetName, "\\StringFileInfo\\040904E4\\");
  194.         cchRoot = lstrlen(szGetName);
  195.  
  196.         // Walk through the dialog items that we want to replace:
  197.         for (i = IDD_VERFIRST; i <= IDD_VERLAST; i++)
  198.         {
  199.             BOOL  fRet;
  200.             UINT  cchVer = 0;
  201.             LPSTR lszVer = NULL;
  202.             char  szResult[256];
  203.  
  204.             GetDlgItemText(hdlg, i, szResult, sizeof(szResult));
  205.             lstrcpy(&szGetName[cchRoot], szResult);
  206.             fRet = VerQueryValue(lpvMem, szGetName, (LPVOID) &lszVer, &cchVer);
  207.  
  208.             if (fRet && cchVer && lszVer)
  209.             {
  210.                 // Replace dialog item text with version info
  211.                 lstrcpy(szResult, lszVer);
  212.                 SetDlgItemText(hdlg, i, szResult);
  213.             }
  214.         }
  215.         GlobalUnlock(hMem);
  216.         GlobalFree(hMem);
  217.     }
  218.     return TRUE;
  219. }
  220.  
  221. //
  222. //  FUNCTION: MsgAboutCommand(HWND, UINT, WPARAM, LPARAM)
  223. //
  224. //  PURPOSE: Process WM_COMMAND message sent to the about box.
  225. //
  226. //  PARAMETERS:
  227. //    hwnd - The window handing the message.
  228. //    uMessage - The message number. (unused).
  229. //    wparam - Message specific data (unused).
  230. //    lparam - Message specific data (unused).
  231. //
  232. //  RETURN VALUE:
  233. //    Always returns 0 - message handled.
  234. //
  235. //  COMMENTS:
  236. //    Uses this DipsCommand function defined in wndproc.c combined
  237. //    with the cmdiAbout structure defined in this file to handle
  238. //    the command messages for the about dialog box.
  239. //
  240.  
  241. #pragma argsused
  242. LRESULT MsgAboutCommand(HWND   hwnd,
  243.                         UINT   uMessage,
  244.                         WPARAM wparam,
  245.                         LPARAM lparam)
  246. {
  247.     return DispCommand(&cmdiAbout, hwnd, wparam, lparam);
  248. }
  249.  
  250. //
  251. //  FUNCTION: CmdAboutDone(HWND, WORD, HWND)
  252. //
  253. //  PURPOSE: Free the about box and related data.
  254. //
  255. //  PARAMETERS:
  256. //    hwnd - The window handling the command.
  257. //    wCommand - The command to be handled (unused).
  258. //    hwndCtrl - NULL (unused).
  259. //
  260. //  RETURN VALUE:
  261. //    Always returns TRUE.
  262. //
  263. //  COMMENTS:
  264. //    Calls EndDialog to finish the dialog session.
  265. //
  266.  
  267. #pragma argsused
  268. LRESULT CmdAboutDone(HWND hdlg, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  269. {
  270.     if (hFontCopyright)
  271.        DeleteObject(hFontCopyright);
  272.  
  273.     EndDialog(hdlg, TRUE);          // Exit the dialog
  274.     return TRUE;
  275. }
  276.